package de.htw.ejb.transaktionen.artikelverwaltung.schnittstelle;

/**
 * Klasse fuer die Verwaltung von Artikeln
 * 
 * @author Torsten Mansfeld
 * 
 */
import java.util.Date;
import java.util.List;
import java.util.Properties;

import javax.ejb.Stateless;
import javax.ejb.TransactionAttribute;
import javax.ejb.TransactionAttributeType;
import javax.ejb.TransactionManagement;
import javax.ejb.TransactionManagementType;
import javax.naming.Context;
import javax.naming.InitialContext;
import javax.naming.NamingException;

import de.htw.ejb.manager.EntityManagementDienstBean;
import de.htw.ejb.manager.EntityManagementDienstRemote;
import de.htw.ejb.manager.exceptions.EntityManagementDienstException;
import de.htw.ejb.model.Artikel;
import de.htw.ejb.model.Bestellposition;
import de.htw.ejb.model.Bestellung;
import de.htw.ejb.model.Dessert;
import de.htw.ejb.model.Getraenk;
import de.htw.ejb.model.Pasta;
import de.htw.ejb.model.Salat;
import de.htw.ejb.model.Zutat;

@Stateless
@TransactionManagement( TransactionManagementType.CONTAINER )
@TransactionAttribute( TransactionAttributeType.REQUIRES_NEW )
public class Artikelverwaltung implements IArtikelverwaltung
{
	
	
	//EntityManagementDienstBean manager;
	EntityManagementDienstRemote em;
	Properties properties = new Properties();
	
	
	public void initManager(){
		properties.put( Context.INITIAL_CONTEXT_FACTORY,
				"org.jnp.interfaces.NamingContextFactory" );
		properties.put( Context.PROVIDER_URL, "127.0.0.1:1099" );
		InitialContext ctx;
		try{
		ctx = new InitialContext( properties );
		
		this.em = ( EntityManagementDienstRemote ) ctx
			.lookup( "EntityManagementDienstBean/remote" );
		}catch ( NamingException e1 )
		{
			// TODO Auto-generated catch block
			e1.printStackTrace();
		}

	}
	
	@Override
	public void erstelleArtikel( String name, double preis, int kategorie )
	{
		initManager();
//		Properties properties = new Properties();
//		properties.put( Context.INITIAL_CONTEXT_FACTORY,
//				"org.jnp.interfaces.NamingContextFactory" );
//		properties.put( Context.PROVIDER_URL, "127.0.0.1:1099" );
//		InitialContext ctx;

		Artikel neu = new Artikel();
		switch ( kategorie )
		{
		case 2:
			neu = new Pasta();
			break;
		case 3:
			neu = new Dessert();
			break;
		case 4: 
			neu=new Salat();
			break;
		case 5:
			neu=new Getraenk();
			break;
		case 6: 
			neu=new Zutat();
			break;
		}
			
		neu.setBezeichnung( name );
		neu.setPreis( preis );
		neu.setKategorie( kategorie );
		
		try
		{
			
			em.speichern( neu );
		}
		catch ( EntityManagementDienstException e )
		{
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		
		
	}
	
	@Override
	public void erstelleArtikel(Artikel neu )
	{
	//	Properties properties = new Properties();
	//	properties.put( Context.INITIAL_CONTEXT_FACTORY,
	//			"org.jnp.interfaces.NamingContextFactory" );
	//	properties.put( Context.PROVIDER_URL, "127.0.0.1:1099" );
	//	InitialContext ctx;

	
	
		initManager();
		try
		{
			//ctx = new InitialContext( properties );
			
			//EntityManagementDienstRemote em = ( EntityManagementDienstRemote ) ctx
			//	.lookup( "EntityManagementDienstBean/remote" );
			//manager.speichern( neu );
			em.speichern(neu);
		}
		catch ( EntityManagementDienstException e )
		{
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		//catch ( NamingException e1 )
		//{
			// TODO Auto-generated catch block
	//		e1.printStackTrace();
		//}
		
	}

	
	@Override
	public void loescheArikel( String artikelname )
	{
		initManager();
		Artikel alt = sucheArtikel( artikelname );
		try
		{
			em.loescheArtikel(alt.getArtikelnummer());
			//manager.loescheArtikel( alt.getArtikelnummer() );
		}
		catch ( EntityManagementDienstException e )
		{
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		
	}
	
	@Override
	public void aenderePreis( String artikelname, int neuerPreis )
	{
		initManager();
		Artikel alt = sucheArtikel( artikelname );
		alt.setPreis( neuerPreis );
		try
		{
			em.loescheArtikel( alt.getArtikelnummer() );
		}
		catch ( EntityManagementDienstException e )
		{
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		try
		{
			em.speichern( alt );
		}
		catch ( EntityManagementDienstException e )
		{
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		// TODO Auto-generated method stub
		
	}
	
	@Override
	public Artikel sucheArtikel( String artikelname )
	{
		initManager();
		Artikel suchart = null;
		try
		{
			suchart = ( Artikel ) em.sucheArtikelPerBezeichnung( artikelname );
		}
		catch ( EntityManagementDienstException e )
		{
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		return suchart;
	}
	
	@Override
	public Artikel sucheArtikel( int artikelid )
	{
		initManager();
		Artikel suchart = null;
		
		try
		{
			suchart = ( Artikel ) em.sucheArtikelPerArtikelnummer( artikelid );
		}
		catch ( EntityManagementDienstException e )
		{
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		
		// TODO Auto-generated method stub
		return suchart;
		
	}
	
	@Override
	public double umsatzermittelnkomplett( String artikelname )
	{
		initManager();
		List<Bestellung> artikelliste = null;
		double umsatz = 0;
		
		int index = 0;
		for ( index = 0; index < artikelliste.size(); index++ )
		{
			List<Bestellposition> bestellpos = ( List<Bestellposition> ) artikelliste
					.get( index ).getPositionen();
			for ( int i = 0; i < bestellpos.size(); i++ )
			{
				if ( bestellpos.get( i ).getArtikel().getBezeichnung()
						.equals( artikelname ) )
				{
					umsatz += bestellpos.get( i ).getArtikel().getPreis()
							* bestellpos.get( i ).getAnzahl();
				}
				
			}
			
		}
		return umsatz;
		
	}
	
	@Override
	public double umsatzermittelnzeitraum( String artikelname, Date datum )
	{
		initManager();
		List<Bestellung> artikelliste = null;
		double umsatz = 0;
		// Bestellungsliste
		int index = 0;
		while ( artikelliste.get( index ).getLieferdatum().compareTo( datum ) >= 0 )
		{
			List<Bestellposition> bestellpos = ( List<Bestellposition> ) artikelliste
					.get( index ).getPositionen();
			for ( int i = 0; i < bestellpos.size(); i++ )
			{
				if ( bestellpos.get( i ).getArtikel().getBezeichnung()
						.equals( artikelname ) )
				{
					umsatz += bestellpos.get( i ).getArtikel().getPreis()
							* bestellpos.get( i ).getAnzahl();
				}
				
			}
			
		}
		return umsatz;
	}
	
	@Override
	public void bearbArtikel( String artikelname, int neuerPreis, int kategorie )
	{
		initManager();
		Artikel alt = sucheArtikel( artikelname );
		try
		{
			em.loescheArtikel( alt.getArtikelnummer() );
		}
		catch ( EntityManagementDienstException e )
		{
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		
		alt.setBezeichnung( artikelname );
		alt.setPreis( neuerPreis );
		alt.setKategorie( kategorie );
		try
		{
			em.speichern( alt );
		}
		catch ( EntityManagementDienstException e )
		{
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		
	}
	
}
